Skip to content

docs(design): decision 19 — control-plane egress relaying#12

Merged
bodaay merged 1 commit into
mainfrom
feat/control-plane-egress-relay
Jun 1, 2026
Merged

docs(design): decision 19 — control-plane egress relaying#12
bodaay merged 1 commit into
mainfrom
feat/control-plane-egress-relay

Conversation

@bodaay

@bodaay bodaay commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Locks the contract for control-plane egress relaying.

Threat model: coxswain dials out to every node (gRPC NodeControl :8444, SSH :22), so an observer watching any one public node sees coxswain's egress IP — revealing operator location and clustering the fleet to a single pivot. "Zero inbound" hides attack surface, not observability. The data-plane cascade (decision 18) doesn't help — it hides client→destination, not controller→node.

Decision 19: route coxswain→node through a protocol-blind raw-TCP relay (coxswain → relay → node:port). Both channels are already end-to-end secured, so the relay terminates neither — one generic relay serves both. Reuses the beacon reverse tunnel with the substream direction inverted (coxswain opens). Fixed hop path; one DialContext chokepoint; v1 = single relay, N-relay chain + onion deferred.

Implemented in PharosVPN/beacon#N and PharosVPN/coxswain#32.

🤖 Generated with Claude Code

Add the threat model — coxswain dials out to every node, so any node-side
observer sees coxswain's egress IP, revealing operator location and
clustering the fleet — and the decision: a protocol-blind raw-TCP egress
relay reusing the beacon reverse tunnel with the substream direction
inverted (coxswain opens). Fixed hop path; one DialContext chokepoint for
SSH + gRPC; v1 single relay, N-relay chain and onion deferred.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@bodaay bodaay merged commit 74050a5 into main Jun 1, 2026
@bodaay bodaay deleted the feat/control-plane-egress-relay branch June 1, 2026 22:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant